JavaMail实现收发邮件(五)使用SSL实现加密传输

您所在的位置:网站首页 java sendmail JavaMail实现收发邮件(五)使用SSL实现加密传输

JavaMail实现收发邮件(五)使用SSL实现加密传输

#JavaMail实现收发邮件(五)使用SSL实现加密传输 | 来源: 网络整理| 查看: 265

首页 » Java » JavaSe » 正文

JavaMail实现收发邮件(五)使用SSL实现加密传输  2015/12/05 | JavaSe | admin | 6 条评论 | 16489 views

一 概念简介

Secure Socket Layer,为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃听。一般通用之规格为40 bit之安全标准,美国则已推出128 bit之更高安全标准,但限制出境。只要3.0版本以上之I.E.或Netscape浏览器即可支持SSL。 当前版本为3.0。它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。 (PS:来至百度百科)

二 在JavaMail中使用SSL对邮件发送进行加密

实际上大部分操作都跟普通的邮件发送是一样的,只是有两个地方有所变化。(1)传输端口从25改成465;(2)替换默认的socketFactory

下面我以163邮箱实现的SSL传输举例说明,下图是163邮箱官方给出的相关配置信息:

163邮箱

代码如下,关键地方有注释,就不多说了:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186package javamail.zifangsky.com; import java.io.UnsupportedEncodingException;import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.Properties; import javax.activation.DataHandler;import javax.activation.FileDataSource;import javax.mail.Address;import javax.mail.BodyPart;import javax.mail.Multipart;import javax.mail.Session;import javax.mail.Transport;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeBodyPart;import javax.mail.internet.MimeMessage;import javax.mail.internet.MimeMultipart;import javax.mail.internet.MimeUtility; public class SendMailBySSL {    private final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";    private String smtpServer; // SMTP服务器地址    private String port; // 端口    private String username; // 登录SMTP服务器的用户名    private String password; // 登录SMTP服务器的密码    private List recipients = new ArrayList(); // 收件人地址集合    private String subject; // 邮件主题    private String content; // 邮件正文    private List attachmentNames = new ArrayList(); // 附件路径信息集合     public SendMailBySSL() {     }     public SendMailBySSL(String smtpServer, String port, String username,            String password, List recipients, String subject,            String content, List attachmentNames) {        this.smtpServer = smtpServer;        this.port = port;        this.username = username;        this.password = password;        this.recipients = recipients;        this.subject = subject;        this.content = content;        this.attachmentNames = attachmentNames;    }     public void setSmtpServer(String smtpServer) {        this.smtpServer = smtpServer;    }     public void setPort(String port) {        this.port = port;    }     public void setUsername(String username) {        this.username = username;    }     public void setPassword(String password) {        this.password = password;    }     public void setRecipients(List recipients) {        this.recipients = recipients;    }     public void setSubject(String subject) {        this.subject = subject;    }     public void setContent(String content) {        this.content = content;    }     public void setAttachmentNames(List attachmentNames) {        this.attachmentNames = attachmentNames;    }     /**     * 进行base64加密,防止中文乱码     * */    public String changeEncode(String str) {        try {            str = MimeUtility.encodeText(new String(str.getBytes(), "UTF-8"),                    "UTF-8", "B"); // "B"代表Base64        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        }        return str;    }     /**     * 正式发邮件     * */    public boolean sendMail() {        Properties properties = new Properties();        properties.put("mail.smtp.host", smtpServer);        properties.put("mail.smtp.auth", "true");        properties.put("mail.smtp.socketFactory.class", SSL_FACTORY);  //使用JSSE的SSL socketfactory来取代默认的socketfactory        properties.put("mail.smtp.socketFactory.fallback", "false");  // 只处理SSL的连接,对于非SSL的连接不做处理                                                                        properties.put("mail.smtp.port", port);        properties.put("mail.smtp.socketFactory.port", port);         Session session = Session.getInstance(properties);        session.setDebug(true);        MimeMessage message = new MimeMessage(session);         try {            // 发件人            Address address = new InternetAddress(username);            message.setFrom(address);             // 收件人            for (String recipient : recipients) {                System.out.println("收件人:" + recipient);                Address toAddress = new InternetAddress(recipient);                message.setRecipient(MimeMessage.RecipientType.TO, toAddress); // 设置收件人,并设置其接收类型为TO                /**                 * TO:代表有健的主要接收者。 CC:代表有健的抄送接收者。 BCC:代表邮件的暗送接收者。                 * */            }             // 主题            message.setSubject(changeEncode(subject));             // 时间            message.setSentDate(new Date());             Multipart multipart = new MimeMultipart();            // 添加文本            BodyPart text = new MimeBodyPart();            text.setText(content);            multipart.addBodyPart(text);            // 添加附件            for (String fileName : attachmentNames) {                BodyPart adjunct = new MimeBodyPart();                FileDataSource fileDataSource = new FileDataSource(fileName);                adjunct.setDataHandler(new DataHandler(fileDataSource));                adjunct.setFileName(changeEncode(fileDataSource.getName()));                multipart.addBodyPart(adjunct);            }            // 清空收件人集合,附件集合            recipients.clear();            attachmentNames.clear();             message.setContent(multipart);            message.saveChanges();         } catch (Exception e) {            e.printStackTrace();            return false;        }         try {            Transport transport = session.getTransport("smtp");            transport.connect(smtpServer, username, password);            transport.sendMessage(message, message.getAllRecipients());            transport.close();        } catch (Exception e) {            e.printStackTrace();            return false;        }         return true;    }     public static void main(String[] args) {        List recipients = new ArrayList();//        recipients.add("[email protected]");        recipients.add("[email protected]");        String subject = "这封邮件是为了测试SMTP的SSL加密传输";        String content = "这是这封邮件的正文";        List attachmentNames = new ArrayList();        attachmentNames.add("C://Users//Administrator//Desktop//kali.txt");        SendMailBySSL sendMailBySSL = new SendMailBySSL("smtp.163.com", "465",                "[email protected]", "youpassword", recipients, subject, content,                attachmentNames);        sendMailBySSL.sendMail();    } } 

三 测试结果如下

QQ邮箱

附:其他的几篇相关文章:

JavaMail实现收发邮件(一)相关概念概述

JavaMail实现收发邮件(二)发送邮件

JavaMail实现收发邮件(三)接收邮件

JavaMail实现收发邮件(四)各大主流邮件服务器地址

赞 (4) JavaMail SSL 加密©版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。转载请注明来源:JavaMail实现收发邮件(五)使用SSL实现加密传输 - zifangsky的个人博客 上一篇 下一篇 你可能也喜欢: 在Java中实现AES加解密 LAMP环境添加SSL证书,使网站变成HTTPS加密传输 在Java中利用Apache Commons Codec API实现常见的加密解密算法,如:md5,sha256 指定长度的数组的子集的排列情况算法 解决Jackson反序列化XML爆 MismatchedInputException 的异常 本文共 6 个回复 船长 2017/09/06 09:41

通过jsp怎么调用这个class 发送邮件呢?? 望作者在写个详细的告知感激不尽,实在是不会

回复 admin 博主 2017/09/06 10:10

@ 船长 从你的回复就看出你应该才刚学Java后台开发 :eek: 。在实际开发中,像发送邮件这种操作是不会在前台页面(如:JSP文件)中执行的,而是在后台处理。也就是说你在后台某个地方需要发送邮件时调用这个方法就可以发送了。如果你使用了Spring框架,那么可以通过使用Spring封装的邮件收发服务更简洁方便的实现邮件发送功能,具体可以参考我的这篇文章:https://www.zifangsky.cn/875.html

回复 船长 2017/09/07 22:15

@ admin 亲,你说对了,问题是jsp页面中怎么调用这个方法我不会,,,jsp可以直接调用这个class的方法吗?? 能麻烦您给个详细的代码吗?? 感谢楼主

回复 admin 博主 2017/09/08 09:29

@ 船长

你直接把这里的代码逻辑copy到JSP页面里面不就可以了吗?你不会说你连在JSP页面写Java代码都不会吧?关于这点你还是自己去百度吧 回复 秋枫 2016/12/08 16:40

32个赞。成功了

回复 admin 博主 2016/12/08 18:17

@ 秋枫 ←_←

回复 发表评论 取消


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3